%% Test mahalalobis distance with data from excercise 2.2
clear;

classnames = {'BRICKFACE', 'SKY', 'FOLIAGE', 'CEMENT', 'WINDOW', 'PATH', 'GRASS'}; % Unsere moeglichen Klassen (reihenfolge ist wichtig!)
TRAIN = importdata('ImageSegmentation/segmentation.data', ',', 4); 
TEST = importdata('ImageSegmentation/segmentation.test', ',', 4);
TRAININGDATA = TRAIN.data; % initialisierung der Data-Matrix (Daten der zu pruefenden Instanzen)
TESTDATA = TEST.data; % initialisierung der Test-Matrix (Daten der Feature-Datenbank)
TRAINNAMES = TRAIN.textdata(5:end, 1);
TESTNAMES = TEST.textdata(5:end, 1);
test_count = size(TESTNAMES, 1);
training_count = size(TESTNAMES, 1);
matches = 0;
category_matches = 0;

% Initialisierung der Vektoren mit den Klassentypen zu jedem in TESTDATA
% und TRAINDATA angegebenen Featurevektor
GROUPTEST = zeros(size(TESTNAMES, 1), 1);
GROUPTRAIN = zeros(size(TRAINNAMES, 1), 1);

%% Erstellen der GROUPTRAIN und GROUPTEST Vektoren als Uebergabeparameter 
    %fuer die mahalanobis Funktion
for x = 1 : size (TRAINNAMES)
    tmp = TRAINNAMES{x};
        if strcmp(tmp, 'BRICKFACE')
            tempclass = 1;
        elseif strcmp(tmp, 'SKY')
            tempclass = 2;    
        elseif strcmp(tmp, 'FOLIAGE')
            tempclass = 3;
        elseif strcmp(tmp, 'CEMENT')
            tempclass = 4;
        elseif strcmp(tmp, 'WINDOW')
            tempclass = 5;
        elseif strcmp(tmp, 'PATH')
            tempclass = 6;
        elseif strcmp(tmp, 'GRASS')
            tempclass = 7;
        end
    GROUPTRAIN(x) = tempclass;
end;

for z = 1 : size (TESTNAMES)
    tmp = TESTNAMES{z};
        if strcmp(tmp, 'BRICKFACE')
            tempclass = 1;
        elseif strcmp(tmp, 'SKY')
            tempclass = 2;    
        elseif strcmp(tmp, 'FOLIAGE')
            tempclass = 3;
        elseif strcmp(tmp, 'CEMENT')
            tempclass = 4;
        elseif strcmp(tmp, 'WINDOW')
            tempclass = 5;
        elseif strcmp(tmp, 'PATH')
            tempclass = 6;
        elseif strcmp(tmp, 'GRASS')
            tempclass = 7;
        end
    GROUPTEST(z) = tempclass;
end;

%% Aufrufen des Mahalanobis Klassifikators
% Hier den 4ten Parameter auf 1,2 oder 3 veraendern um an die restlichen Modi zu
% kommen (siehe mahalanobis.m)
CLASSIFICATION = mahalanobis(TRAININGDATA, GROUPTRAIN, TESTDATA, 1);


%% Auswertung
 for i = 1 : size(GROUPTEST, 1)
    
    %% Unterteilung in NATURE und HUMAN Kategorien (1-3 Nature, 4-7 Human)   
    if GROUPTEST(i,1) <= 3 
        creator_real = 1;
        cr_str = 'NATURE ';
    else
        creator_real = 0;
        cr_str = 'HUMAN ';
    end
    
    if CLASSIFICATION(i,1) <= 3 
        creator_mahab = 1;
        ck_str = 'NATURE ';
    else
        creator_mahab = 0;
        ck_str = 'HUMAN ';
    end 

    disp(['Index: ', int2str(i), ' Tatsaechliche Klasse: ', cr_str , classnames{GROUPTEST(i,1)}, ' - Mahalanobis-Klasse: ', ck_str , classnames{CLASSIFICATION(i,1)}]);
    
    %% Auswertung:
    if GROUPTEST(i, 1) == CLASSIFICATION(i,1) % Stimmt die Klasse des Trainingsdatensatzes mit der gefundenen Klasse ueberein, so wird eine richtige Zuordnung registriert
        matches = matches + 1;
    end;
    
    if creator_real == creator_mahab % Stimmen der Original-Ersteller und der gefundene Ersteller ueberein, so wird ein richtige Zuordnung registriert
        category_matches = category_matches + 1;
    end;
  
end; % for loop

%% Auswertung
percentage = matches / test_count * 100; % Berechnet den Prozentsatz der richtig zugeordneten Bilder
disp(['Bildklassen richtig zugeordnet: ', int2str(matches), '/', int2str(training_count), ' = ', num2str(percentage)]);
category_percentage = category_matches / test_count * 100; % Berechnet den Prozentsatz der richtig zugeordneten Ersteller
disp(['Bildersteller richtig zugeordnet: ', int2str(category_matches), '/', int2str(training_count), ' = ', num2str(category_percentage)]);
